package com.hp.ams.ongoing.netatendimento.application.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.hp.ams.ongoing.netatendimento.infrastructure.exception.DataBaseAcessException;
import com.hp.ams.ongoing.netatendimento.infrastructure.persistence.MongoDbRepository;
import com.hp.ams.ongoing.netatendimento.model.entity.Categorizacao;
import com.hp.ams.ongoing.netatendimento.model.entity.Cidade;
import com.hp.ams.ongoing.netatendimento.model.entity.GrupoExecucao;
import com.hp.ams.ongoing.netatendimento.model.entity.GrupoExecucaoCategorizacao;
import com.hp.ams.ongoing.netatendimento.model.entity.ScriptExecucao;
import com.hp.ams.ongoing.netatendimento.model.entity.TipoRegistro;
import com.hp.ams.ongoing.netatendimento.model.valueobject.ResultOperationVO;

public class ServiceBasicData {
	
	private MongoDbRepository repository = MongoDbRepository.getInstance();

	private static ServiceBasicData service;
	
	public static ServiceBasicData getInstance(){       
        if(service == null)  
        	service = new ServiceBasicData();   
        return service;  

  }
	

	private ServiceBasicData() {
		// TODO Auto-generated constructor stub
	}
	
	public List<TipoRegistro> getAllTipoRegistro() throws DataBaseAcessException{
		Map<String,Object> map = new HashMap<String,Object>();
		return repository.findAll(TipoRegistro.class);
	}
	
	public Object findDataByParam(Class clazz, Map<String,Object> param) throws DataBaseAcessException{	
		return repository.findByQuery(clazz, param).get(0);
	}
	
	public List<Cidade> getAllCidades() throws DataBaseAcessException{
		return repository.findAll(Cidade.class);
	}
	
	public List getAllByEntity(Class clazz) throws DataBaseAcessException{
		Map<String,Object> map = new HashMap<String,Object>();		
		return repository.findAll(clazz);
	}
	
	
	
	public List findGruposByCategorizacao(Class clazz, Categorizacao cat) throws DataBaseAcessException{
		
		//recupera grupos relacionados a categoria
		Map<String,Object> map = new HashMap<String,Object>();		
		map.put("id_categoria", cat.getIdCategoria());
		List<GrupoExecucaoCategorizacao> gruposCat = repository.findByQuery(GrupoExecucaoCategorizacao.class, map);
		List<GrupoExecucao> grupos = new ArrayList<GrupoExecucao>();
		for (GrupoExecucaoCategorizacao item : gruposCat) {
			grupos.add(item.getGrupoExecucao());
		}
		return grupos;
	}
	
	public List findScriptsByGrupo(Class clazz, GrupoExecucao gr) throws DataBaseAcessException{
		
		//recupera grupos relacionados a categoria
		Map<String,Object> map = new HashMap<String,Object>();		
		map.put("id_grupo_execucao", gr.getIdGrupoExecucao());
		List<ScriptExecucao> scripts = repository.findByQuery(ScriptExecucao.class, map);		
		return scripts;
	}
	
	public Cidade findCidadeByParams(String param){
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("ci_nome", param); 
		map.put("cid_contrato", param);
		map.put("cod_operadora", param);
		Cidade ret = null;
		try {
			List<Cidade> lst = repository.findByQuery(Cidade.class, map,"or");			
			ret = lst.get(0);
		} catch (Exception e) {
			System.out.println("Erro para buscar : "+map);
		}
		
		return ret;
	}
	
	public ResultOperationVO save(Class clazz, Object[] values) throws DataBaseAcessException{
		return repository.insertDocumentToCollection(clazz, values);
	}
	
	public void deleteAll(Class clazz) throws DataBaseAcessException{
		repository.getInstance().removeAll(clazz);
	}
	
	public void createCollection(Class col){
		repository.createCollection(col);
	}

}
